<?php
namespace app\admin\controller;
use app\common\controller\Adminbase;
use \think\Loader;
use \think\Db;

// +----------------------------------------------------------------------
// | XpCms
// +----------------------------------------------------------------------
// | Copyright (c) 2021-2099
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Mercurio（Xp） <725668993@qq.com>
// +----------------------------------------------------------------------

/*
** 角色管理 控制器
*/

class Rbac extends Adminbase {
	private static $_role = null; // 数据表对象
	private static $_roleuser = null; // 数据表对象
	
	// 优先加载
	public function _initialize() {
		parent::_initialize();
		
		// 实例化数据表模型
		self::$_role = Loader::model('Role');
		self::$_roleuser = Loader::model('Roleuser');
	}
	
	// 角色列表
	public function index() {
	    
	    // 当前页
		$nowPage = 1;
		if(isset($_GET['page']) && $_GET['page']){
			$nowPage = input('param.page/d');
			$nowPage = $nowPage > 0 ? $nowPage : 1;
		}
		
		$where = array();
		
		if(input('param.keyword')){
		    $keyword = input('param.keyword');
		    $this -> assign('keyword', $keyword);
		    $where['name|remark']=array('like','%'.$keyword.'%');
		}
		
		// 每页显示条数，默认 10 条
		$pagesize=input('param.page_size')?input('param.page_size'):10;
		$this -> assign('pagesize', pagesize($pagesize));
		
		$lists = self::$_role -> roleLists($where, $nowPage, $pagesize);
		
		$this -> assign('rolelists', $lists['lists']);
		$this -> assign('page', $lists['page']);
		return view('index');
	}
	
	// 新增角色页面
	public function add() {
		
		return view('add');
	}
	
	// 保存新增角色
	public function addsave() {
		$inputs = input('post.');
		
		// 使用模型验证器进行验证
		$result = $this -> validate($inputs, 'Role.add');
		if(true !== $result){
			// 验证失败 输出错误信息
			$this -> error($result);
		}
		
		// 验证新增角色名称是否重复
		$this -> checkNameAdd($inputs['name']);
		
		// 保存数据
		if(self::$_role -> data($inputs) -> save()){
			$this -> success('操作成功', 'index');
		}
		
		$this -> error('操作失败');
	}
	
	// 编辑角色页面
	public function edit() {
		
		$id = input('param.id/d');
		if(!$id){
			$this -> error('参数错误');
		}
		
		// 获取本条角色数据
		$lists = self::$_role -> getRoleDetail($id);
		if(!$lists){
			$this -> error('参数错误');
		}
		
		$this -> assign('lists', $lists);
		return view('add');
	}
	
	// 保存编辑角色
	public function editsave() {
		$inputs = input('post.');
		
		$id = (int) $inputs['id'];
		if(!$id){
			$this -> error('参数错误');
		}
		
		// 使用模型验证器进行验证
		$result = $this -> validate($inputs, 'Role.edit');
		if(true !== $result){
			// 验证失败 输出错误信息
			$this -> error($result);
		}
		
		// 检测本条角色数据是否存在
		$find = self::$_role -> where(array('id' => $id)) -> value('id');
		if(!$find){
			$this -> error('参数错误');
		}
		
		// 验证编辑角色名称是否重复
		$this -> checkNameUpdate($inputs);
		unset($inputs['id']);
		
		// 保存数据
		if(self::$_role -> save($inputs, array('id' => $id))){
			$this -> success('操作成功', 'index');
		}
		$this -> error('操作失败或没有数据可更新');
	}
	
	// 删除角色
	public function deletes() {
		
		$id = input('post.id/d');
		if(!$id){
		    return ['error'=>1,'msg'=>'参数错误'];
		}
		$rolename = self::$_role -> where(array('id' => $id)) -> value('name');
		// 检测是否有用户
		if(self::$_roleuser -> where(array('role_id' => $id)) -> find()){
			return ['error'=>1,'msg'=>'角色'.$rolename.'下有用户，不能删除'];
		}
		$result = self::$_role -> deletes($id);
		if($result['status'] == 1){
		    return ['error'=>0,'msg'=>'删除成功'];
		}
	    return ['error'=>1,'msg'=>$result['msg']];
	}
	
	//批量删除角色
    public function selectDel(){
        $id = input('post.id');
        if(!$id){
			return ['error'=>1,'msg'=>'ID不存在'];
		}
		$ids = explode(',', $id);
		for ($i = 0; $i < count($ids); $i++) {
	        $rolename = self::$_role -> where(array('id' => $ids[$i])) -> value('name');
    		// 检测是否有用户
    		if(self::$_roleuser -> where(array('role_id' => $ids[$i])) -> find()){
    			return ['error'=>1,'msg'=>'角色'.$rolename.'下有用户，不能删除'];
    		}
    		self::$_role -> deletes($id);
		}
		return ['error'=>0,'msg'=>'删除成功!'];
    }
	
	// 编辑角色状态
	public function editstatus() {
		
		$id = input('param.id/d');
		if(!$id){
			$this -> error('参数错误');
		}
		
		$result = self::$_role -> editStatus($id);
		if($result){
		    return ['error'=>0,'msg'=>'操作成功'];
		}
		return ['error'=>1,'msg'=>'操作失败'];
	}
	
	
	// 角色权限设置页面
	public function authorize() {
		$role_id = input('param.id/d');
		$role_id = $role_id > 0 ? $role_id : 0;
		if(!$role_id){
			$this -> error('角色信息错误');
		}
		// 判断，不能修改 超级管理员
		if($role_id == 1){
			$this -> error('角色信息错误');
		}
		
		// 获取已经分配的权限
		$roleHas = Loader::model('Authaccess') -> getHavingAuth($role_id);
		
		// 获取后台顶级菜单
		$topMenu = Loader::model('Menu') -> getTopMenu();
		
		$menus = Db::name('menu')->field('id, pid, name')->select();
		$rules = Db::name('authaccess')->field('menu_id')->where('role_id', $role_id)->select();
		$ruleslist = [];
		for ($i = 0; $i < count($rules); $i++) {
		     array_push($ruleslist, $rules[$i]['menu_id']);
		}
		$rulesstr = implode(',', $ruleslist);
		$list = auth($menus,$pid=0,$rulesstr);
		$list[] = array(
            "id"=>0,
            "pid"=>0,
            "title"=>"全部",
            "open"=>true
        );
		
		$this->view->assign('list',$list);
		return view('authorize');
	}
	
	// 保存角色权限设置
	public function authorizesave() {
		
		$inputs = input('post.');
		
		$role_id = (int) $inputs['id'];
		$role_id = $role_id > 0 ? $role_id : 0;
		
		$ids = $inputs['ids']; // 数组
		
		if(!$role_id){
		    return array('msg'=>'角色信息错误','error'=>1);
		}
		
		// 判断，不能修改超级管理员的
		if($role_id == 1){
		    return array('msg'=>'角色信息错误','error'=>1);
		}
		$ids = explode(',', $ids);
		array_pop($ids);
		// 处理 权限信息 id
		$newIds = array();
		if($ids){
			$newIds = $ids;
			
			if($newIds && is_array($newIds)){
				// in 方法查出 对应的菜单信息
				$menuLists = Loader::model('Menu') -> where(array('id' => array('in', $newIds)))
											-> column('id,module,control,actions');
				
				if($menuLists){
					// 批量删除旧的权限信息
					Loader::model('Authaccess') -> where(array('role_id' => $role_id)) -> delete();
					
					// 组合权限信息
					$authArray = array();
					foreach($menuLists as $key => $val){
						$val['role_id'] = $role_id;
						$val['rule_name'] = strtolower($val['module'] . '/' . $val['control'] . '/' . $val['actions']);
						$val['menu_id'] = $val['id'];
						unset($val['module']);
						unset($val['control']);
						unset($val['actions']);
						unset($val['id']);
						
						$authArray[] = $val;
					}
					
					// 批量插入权限信息
					Loader::model('Authaccess') -> saveAll($authArray);
					
					
			        return array('msg'=>'权限设置成功!','url'=>url('index'),'error'=>0);
				}
			}
		    return array('msg'=>'权限信息错误','error'=>1);
		}else{
			// 批量删除旧的权限信息
			Loader::model('Authaccess') -> where(array('role_id' => $role_id)) -> delete();
			
			return array('msg'=>'权限设置成功!','url'=>url('index'),'error'=>0);
		}
		
		return array('msg'=>'权限设置失败','error'=>1);
	}
	
	// 验证新增 name 是否重复
	private function checkNameAdd($name) {
		
		$find = self::$_role -> where(array('name' => $name)) -> find();
		if($find){
			$this -> error('同样的数据已经存在');
		}
		return true;
	}
	
	// 验证编辑 name 是否重复
	private function checkNameUpdate($data) {
		// 检查是否重复添加
		$id = $data['id'];
		
		$find = self::$_role -> where(array('name' => $data['name'])) -> value('id');
		if($find && $find != $id){
			$this -> error('同样的数据已经存在');
		}
		return true;
	}
	
}
